package pe.edu.upc.e41a.javasoft.service;

import java.util.Date;
import java.util.List;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import pe.edu.upc.e41a.javasoft.domain.Aviso;


@Service
@Transactional
public class AvisoServiceImpl implements AvisoService {

	public long countAllAvisoes() {
        return Aviso.countAvisoes();
    }

	public void deleteAviso(Aviso aviso) {
        aviso.remove();
    }

	public Aviso findAviso(Integer id) {
        return Aviso.findAviso(id);
    }

	public List<Aviso> findAllAvisoes() {
        return Aviso.findAllAvisoes();
    }

	public List<Aviso> findAvisoEntries(int firstResult, int maxResults) {
        return Aviso.findAvisoEntries(firstResult, maxResults);
    }

	public void saveAviso(Aviso aviso) {
        aviso.persist();
    }

	public Aviso updateAviso(Aviso aviso) {
        return aviso.merge();
    }

	//DESDE PROYECTO SCV
	public List<Aviso> mostrarAvisos(Date fecha, int posicion) {
		List<Aviso> listAviso;
		listAviso = Aviso.buscarAvisoPorFechayPosicion(fecha, posicion);
		return listAviso;
	}


	public String registrarAviso(Aviso aviso) {
		String mensaje =null;
		try {
			if(aviso.getTitulo()==null){
				mensaje = "Ingrese el título del aviso.";
				return mensaje;
			}else if(aviso.getMensaje()==null){
				mensaje = "Ingrese el mensaje a mostrar.";
				return mensaje;
			}else if(aviso.getPosicion()==null){
				mensaje = "Ingrese la ubicacion donde se mostrará el aviso.";
				return mensaje;
			}else if(aviso.getUsuario()==null){
				mensaje = "Ingrese sesion como administrador.";
				return mensaje;
			}else if(aviso.getFechaInicio()==null){
				mensaje = "Ingrese la fecha de inicio para el aviso.";
				return mensaje;
			}else if(aviso.getFechaFin()==null){
				mensaje = "Ingrese la fecha de fin para el aviso.";
				return mensaje;
			}else if(!aviso.getFechaFin().after(aviso.getFechaInicio())){
				mensaje = "La fecha de fin debe ser mayor a la fecha de inicio.";
				return mensaje;
			}else if(avisoFechaConcurrente(aviso)){
				mensaje = "Cuncurrencia de tiempo entre avisos. Modifique la fecha de Inicio y/o Fin";
				return mensaje;
			}
				
			aviso.persist();	
			mensaje="El aviso se registró exitosamente.";
		} catch (Exception e) {
			mensaje="Error al registrar el aviso.";
			return mensaje;
		}
		
		return mensaje;
	}
	
	private boolean avisoFechaConcurrente(Aviso aviso){
		boolean estado = false;
		
		List<Aviso> avisosFechaInicio = mostrarAvisos(aviso.getFechaInicio(),aviso.getPosicion());
		List<Aviso> avisosFechaFin = mostrarAvisos(aviso.getFechaFin(),aviso.getPosicion());
		
		if (avisosFechaInicio.size() > 0 || avisosFechaFin.size() > 0){
			estado = true;
		}
		
		return estado;
	}
}
